package cn.toma.common.utils.web;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.lionsoul.ip2region.Util;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Objects;

@Slf4j
public class AddressUtil
{

	public static String getCityInfo(String ip)
	{
		DbSearcher searcher = null;
		try {
			String dbPath = AddressUtil.class.getResource("/ip2region.db").getPath();
			File file = new File(dbPath);
			if (!file.exists()) {
				String tmpDir = System.getProperties().getProperty("java.io.tmpdir");
				dbPath = tmpDir + "ip.db";
				file = new File(dbPath);
				FileUtils.copyInputStreamToFile(Objects.requireNonNull(AddressUtil.class.getClassLoader().getResourceAsStream("classpath:ip2region/ip2region.db")), file);
			}
			int algorithm = DbSearcher.BTREE_ALGORITHM;
			DbConfig config = new DbConfig();
			searcher = new DbSearcher(config, file.getPath());
			Method method = null;
			method = searcher.getClass().getMethod("btreeSearch", String.class);
			DataBlock dataBlock = null;
			if (!Util.isIpAddress(ip)) {
				log.error("Error: Invalid ip address");
			}
			dataBlock = (DataBlock) method.invoke(searcher, ip);
			return dataBlock.getRegion();
		} catch (Exception e) {
			log.error("获取地址信息异常", e);
		} finally {
			if (searcher != null) {
				try {
					searcher.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return "";
	}

}